﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Unimaq.Macroprocesos.LogicaNegocio;

namespace MacroprocesosWinForms.Administrador.ControlUsuario
{
    public partial class Documento : UserControl
    {
        private string CodigoProceso;
        private string CodigoNumeroDocumento;
        private int NumeroDocumento;
        private Unimaq.Macroprocesos.AccesoDatos.Documento selectedDocumento;

        public Documento()
        {
            InitializeComponent();
        }

        public Documento(Unimaq.Macroprocesos.AccesoDatos.Documento selecteddocumento) : this()
        {
            // TODO: Complete member initialization
            this.selectedDocumento = selecteddocumento;
            btnGuardar.Tag = "M";
        }

        private void Documento_Load(object sender, EventArgs e)
        {
            ListarEmpresa();
            ListarTipoDocumento();

            if (btnGuardar.Tag != null)
            {
                if (btnGuardar.Tag.ToString().Equals("M"))
                {
                    RellenarFormulario();
                    btnEliminar.Enabled = true;
                }
            }
            else
            {
                btnEliminar.Enabled = false;
            }
        }

        private void RellenarFormulario()
        {
            if (selectedDocumento != null)
            {
                Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();
                Unimaq.Macroprocesos.AccesoDatos.Proceso selProceso = procesoBLL.GetProceso(new Unimaq.Macroprocesos.AccesoDatos.Proceso() { Id = selectedDocumento.IdProceso.Value });

                Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL empresaBLL = new EmpresaBLL();
                Unimaq.Macroprocesos.AccesoDatos.Empresa selEmpresa = empresaBLL.GetEmpresa(selProceso);

                cmbEmpresa.SelectedIndex = cmbEmpresa.Items.IndexOf(cmbEmpresa.Items.Cast<Unimaq.Macroprocesos.AccesoDatos.Empresa>().SingleOrDefault(x => x.Id.Equals(selEmpresa.Id)));
                this.ListarProceso(selEmpresa);
                
                cmbProceso.SelectedIndex = cmbProceso.Items.IndexOf(cmbProceso.Items.Cast<Unimaq.Macroprocesos.AccesoDatos.Proceso>().SingleOrDefault(x => x.Id.Equals(selProceso.Id)));

                cmbTipoDocumento.SelectedIndex = cmbTipoDocumento.Items.IndexOf(cmbTipoDocumento.Items.Cast<Unimaq.Macroprocesos.AccesoDatos.TipoDocumento>().SingleOrDefault(x => x.Id.Equals(selectedDocumento.IdTipoDocumento.Value)));
                txtCodigo.Text = selectedDocumento.Codigo.Trim();
                txtNombreDocumento.Text = selectedDocumento.Nombre.Trim();
                txtAcceso.Text = selectedDocumento.RutaAcceso.Trim();
            }
        }

        private void ListarEmpresa()
        {
            EmpresaBLL empresaBLL = new EmpresaBLL();
            cmbEmpresa.DataSource = empresaBLL.Listar();
            cmbEmpresa.ValueMember = "Id";
            cmbEmpresa.DisplayMember = "NombreEmpresa";
            cmbEmpresa.SelectedIndex = -1;
        }

        private void ListarProceso(Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa)
        {
            ProcesoBLL procesoBLL = new ProcesoBLL();
            cmbProceso.DataSource = procesoBLL.ListarxEmpresa(selectedEmpresa);
            cmbProceso.ValueMember = "Id";
            cmbProceso.DisplayMember = "Nombre";
            cmbProceso.SelectedIndex = -1;
        }

        private void ListarTipoDocumento()
        {
            TipoDocumentoBLL tipoDocumentoBLL = new TipoDocumentoBLL();
            cmbTipoDocumento.DataSource = tipoDocumentoBLL.Listar();
            cmbTipoDocumento.ValueMember = "Id";
            cmbTipoDocumento.DisplayMember = "NombreDocumento";
            cmbTipoDocumento.SelectedIndex = -1;
        }

        private void cmbEmpresa_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (cmbEmpresa.SelectedIndex >= 0)
            {
                Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = cmbEmpresa.SelectedItem as Unimaq.Macroprocesos.AccesoDatos.Empresa;
                ListarProceso(selectedEmpresa);
            }
        }

        private string GenerarCodigoDocumento()
        {
            return string.Format("{0}-{1}-{2}", CodigoNumeroDocumento, CodigoProceso, NumeroDocumento.ToString().PadLeft(2, '0'));
        }

        private void cmbProceso_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (cmbProceso.SelectedIndex >= 0)
            {
                Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = cmbProceso.SelectedItem as Unimaq.Macroprocesos.AccesoDatos.Proceso;
                string baseCodProceso = selectedProceso.CodigoProceso.Trim();
                int indexOf = baseCodProceso.IndexOf('-') + 1;
                int longCodigo = baseCodProceso.Length - indexOf;
                CodigoProceso = baseCodProceso.Substring(indexOf , longCodigo);

                txtCodigo.Text = GenerarCodigoDocumento();
            }
        }

        private void cmbTipoDocumento_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (cmbProceso.SelectedIndex >= 0)
            {
                Unimaq.Macroprocesos.AccesoDatos.TipoDocumento selectedTipoDocumento = cmbTipoDocumento.SelectedItem as Unimaq.Macroprocesos.AccesoDatos.TipoDocumento;
                CodigoNumeroDocumento = selectedTipoDocumento.Codigo.Trim();

                txtCodigo.Text = GenerarCodigoDocumento();
            }
        }

        private void numNumeroProceso_ValueChanged(object sender, EventArgs e)
        {
            if (numNumeroDocumento.Value > 0)
            {
                NumeroDocumento = Convert.ToInt32(numNumeroDocumento.Value);

                txtCodigo.Text = GenerarCodigoDocumento();
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            bool correcto = false;

            if (cmbEmpresa.SelectedIndex >= 0)
            {
                if (cmbProceso.SelectedIndex >= 0)
                {
                    if (cmbTipoDocumento.SelectedIndex >= 0)
                    {
                        if (!string.IsNullOrWhiteSpace(txtCodigo.Text))
                        {
                            if (!string.IsNullOrWhiteSpace(txtNombreDocumento.Text))
                            {
                                DocumentoBLL documentoBLL = new DocumentoBLL();
                                List<Unimaq.Macroprocesos.AccesoDatos.Documento> lista = documentoBLL.Buscar(int.Parse(cmbProceso.SelectedValue.ToString()), txtCodigo.Text.Trim());

                                if (lista.Count == 0)
                                {
                                    correcto = true;
                                }
                                else
                                {
                                    Unimaq.Macroprocesos.AccesoDatos.Documento documento = lista.First();

                                    if (btnGuardar.Tag != null)
                                    {
                                        if (btnGuardar.Tag.ToString().Equals("M"))
                                        {
                                            if (int.Parse(cmbProceso.SelectedValue.ToString()).Equals(documento.IdProceso.HasValue ? documento.IdProceso.Value : 0) &&
                                                txtCodigo.Text.Trim().Equals(documento.Codigo.Trim()))
                                            {
                                                correcto = true;
                                            } 
                                        } 
                                    }
                                    else
                                    {
                                        MessageBox.Show(string.Format("El documento ya se encuentra registrado:\nCódigo: {0}\nDocumento: {1}", documento.Codigo.Trim(), documento.Nombre.Trim()), "Macroprocesos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);                                        
                                    }
                                }
                            }
                            else
                            {
                                MessageBox.Show("Ingrese el nombre del documento", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Ingrese el codigo del documento", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Seleccione el tipo de documento", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                else
                {
                    MessageBox.Show("Seleccione el proceso al cual pertenece", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Seleccione la empresa", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }

            if (correcto)
            {
                DocumentoBLL documentoBLL;
                int resultado = 0;
                
                Unimaq.Macroprocesos.AccesoDatos.Documento nuevoDocumento =
                    new Unimaq.Macroprocesos.AccesoDatos.Documento()
                    {
                        IdProceso = int.Parse(cmbProceso.SelectedValue.ToString()),
                        IdTipoDocumento = cmbTipoDocumento.SelectedIndex >= 0 ? int.Parse(cmbTipoDocumento.SelectedValue.ToString()) : new Nullable<int>(),
                        Nombre = txtNombreDocumento.Text.Trim(),
                        NumeroDocumento = Convert.ToInt32(numNumeroDocumento.Value),
                        Codigo = txtCodigo.Text.Trim(),
                        RutaAcceso = txtAcceso.Text.Trim()
                    };

                if (btnGuardar.Tag == null)
                {
                    documentoBLL = new DocumentoBLL();
                    resultado = documentoBLL.Registrar(nuevoDocumento);
                }
                else if (btnGuardar.Tag.ToString().Equals("M"))
                {
                    documentoBLL = new DocumentoBLL();
                    resultado = documentoBLL.Actualizar(
                        new Unimaq.Macroprocesos.AccesoDatos.Documento() { Id = selectedDocumento.Id },
                        nuevoDocumento);
                }

                if (resultado > 0)
                {
                    if (btnGuardar.Tag == null)
                    {
                        MessageBox.Show("Documento registrado", "Macroprocesos", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); 
                    }
                    else if (btnGuardar.Tag.ToString().Equals("M"))
                    {
                        MessageBox.Show("Documento modificado", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1); 
                    }
                    
                    LimpiarFormulario();
                    ActualizarArbol();
                    btnEliminar.Enabled = false;
                }
                else
                {
                    MessageBox.Show("Error al registrar el documento", "Macroprocesos", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    LimpiarFormulario();
                    btnEliminar.Enabled = false;
                }
            }
        }

        private void ActualizarArbol()
        {
            PrincipalAdministrador iuPrincipalAdministrador = this.ParentForm as PrincipalAdministrador;
            iuPrincipalAdministrador.CargarArbolProcesos();
        }

        private void LimpiarFormulario()
        {
            ListarEmpresa();
            ListarTipoDocumento();
            cmbProceso.DataSource = null;
            txtCodigo.ResetText();
            numNumeroDocumento.ResetText();
            txtNombreDocumento.ResetText();
            txtAcceso.ResetText();
            btnGuardar.Tag = null;
        }

        private void btnExaminar_Click(object sender, EventArgs e)
        {
            OpenFileDialog folderDialog = new OpenFileDialog();
            folderDialog.Filter = "Archivos PDF (*.PDF)|*.pdf| Documento de Word 1997-2003 (*.doc)|*.doc| Documento de Word 2007 (*.docx)|*.docx";

            DialogResult dr = folderDialog.ShowDialog();

            if (dr == DialogResult.OK)
            {
                txtAcceso.Text = folderDialog.FileName;
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (btnGuardar.Tag != null)
            {
                if (btnGuardar.Tag.ToString().Equals("M"))
                {
                    DialogResult dr = MessageBox.Show("¿Está seguro en eliminar el documento?", "Macroprocesos - UNIMAQ", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

                    if (dr == DialogResult.Yes)
                    {
                        //procede a eliminar
                        if (selectedDocumento != null)
                        {
                            Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL documentoBLL = new DocumentoBLL();

                            int result = 0;
                            result = documentoBLL.Eliminar(selectedDocumento);

                            if (result > 0)
                            {
                                MessageBox.Show("Documento eliminado", "Macroprocesos - UNIMAQ", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);                                
                                LimpiarFormulario();
                                ActualizarArbol();
                                btnEliminar.Enabled = false;
                            }
                            else
                            {
                                MessageBox.Show("Error al eliminar el documento.\nInformar al Administrador.", "Macroprocesos - UNIMAQ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                LimpiarFormulario();
                                btnEliminar.Enabled = false;
                            }
                        }
                    }
                }
            }
        }
    }
}
